<!DOCTYPE html>
<html>
  <head>
    <title>
      offlineaudiocontext-constructor.html
    </title>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      audit.define(
          {label: 'test', description: 'OfflineAudioContext constructor'},
          (task, should) => {
            let context;
            // Make sure we don't crash when giving 0 as number of frames.
            should(
                () => new OfflineAudioContext(1, 0, 44100),
                'new OfflineAudioContext(1, 0, 44100)')
                .throw();
            // Make sure we don't throw exceptions for supported ranges of
            // sample rates for an OfflineAudioContext.
            should(
                () => context = new OfflineAudioContext(2, 512, 2999),
                'context0 = new OfflineAudioContext(2, 512, 2999)')
                .throw();
            should(
                () => context = new OfflineAudioContext(2, 512, 3000),
                'context1 = new OfflineAudioContext(2, 512, 3000)')
                .notThrow();
            should(context.length, 'context1.length').beEqualTo(512);
            should(
                () => context = new OfflineAudioContext(2, 1024, 768000),
                'context2 = new OfflineAudioContext(2, 1024, 768000)')
                .notThrow();
            should(context.length, 'context2.length').beEqualTo(1024);
            should(
                () => context = new OfflineAudioContext(2, 1024, 768001),
                'context3 = new OfflineAudioContext(2, 1024, 768001)')
                .throw();
            should(
                () => context = new OfflineAudioContext(2, 2048, 8000),
                'context4 = new OfflineAudioContext(2, 2048, 8000)')
                .notThrow();
            should(context.length, 'context4.length').beEqualTo(2048);
            should(
                () => context = new OfflineAudioContext(2, 4096, 11025),
                'context5 = new OfflineAudioContext(2, 4096, 11025)')
                .notThrow();
            should(context.length, 'context5.length').beEqualTo(4096);
            should(
                () => context = new OfflineAudioContext(2, 512, 22050),
                'context6 = new OfflineAudioContext(2, 512, 22050)')
                .notThrow();
            should(context.length, 'context6.length').beEqualTo(512);
            should(
                () => context = new OfflineAudioContext(2, 512, 44100),
                'context7 = new OfflineAudioContext(2, 512, 44100)')
                .notThrow();
            should(context.length, 'context7.length').beEqualTo(512);
            should(
                () => context = new OfflineAudioContext(2, 512, 48000),
                'context8 = new OfflineAudioContext(2, 512, 48000)')
                .notThrow();
            should(context.length, 'context8.length').beEqualTo(512);

            should(
                () => context = new OfflineAudioContext(2, 512, 88200),
                'context9 = new OfflineAudioContext(2, 512, 88200)')
                .notThrow();
            should(context.length, 'context9.length').beEqualTo(512);

            // Make sure length is read-only.
            should(() => context.length = 99, 'context9.length = 99')
                .notThrow();
            should(context.length, 'context9.length after illegal setter value')
                .beEqualTo(512);
            should(
                () => context = new OfflineAudioContext(2, 512, 96000),
                'context10 = new OfflineAudioContext(2, 512, 96000)')
                .notThrow();
            // Make sure we throw exceptions for non-finite sample rates.
            should(
                () => context = new OfflineAudioContext(1, 0, NaN),
                'context11 = new OfflineAudioContext(1, 0, NaN)')
                .throw();
            should(
                () => context = new OfflineAudioContext(1, 0, Infinity),
                'context12 = new OfflineAudioContext(1, 0, Infinity)')
                .throw();
            // Verify channel counts and other destination attributes are set
            // correctly.
            should(
                () => context = new OfflineAudioContext(7, 512, 48000),
                'context13 = new OfflineAudioContext(7, 512, 48000)')
                .notThrow();
            should(
                context.destination.channelCount,
                'context13.destination.channelCount')
                .beEqualTo(7);
            should(
                context.destination.maxChannelCount,
                'context13.destination.maxChannelCount')
                .beEqualTo(7);
            should(
                context.destination.channelCountMode,
                'context13.destination.channelCountMode')
                .beEqualTo('explicit');
            should(
                context.destination.channelInterpretation,
                'context13.destination.channelInterpretation')
                .beEqualTo('speakers');

            task.done();
          });

      audit.run();
    </script>
  </body>
</html>
